<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2018/4/19
 * Time: 12:02
 */

namespace app\admin\controller;

use think\Controller;
use think\Db;
use think\Request;
use think\Session;

class Userlist extends AdminController
{
    public function index()
    {
        // 查询 user表中的信息 及 role 表中的 name， 将 所属角色 遍历到页面上
        $query = Db::field('u.id, u.username, u.name, u.status, u.face, r.rid')
            ->name('user')
            ->alias('u')
            ->join('user_role r', 'u.id = r.uid')
            ->buildSql();


        // s 为 $query 的别名, 将s 表中的数据 分组，且与 role 表 查询
        // 结果：u.id, u.username, u.name, r.name
        $list = Db::field('s.id, s.username, s.name, s.status, s.face, group_concat(r.name) rname')
            ->table($query)
            ->alias('s')
            ->join('role r', 's.rid = r.id')
            ->group('s.id desc')
            ->select();

        // 查询 user_role表中的 uid
        $uidList = Db::field('uid')
            ->name('user_role')
            ->select();

        // 将 user_role.uid 放入一个空数组
        $arr = [];
        foreach ($uidList as $k => $v) {
            $arr[] = $v['uid'];
        }

        // 自定义一个空字段，存放rname
        // 结果：id, username, name, rname  二维数组
        $res = Db::field("id, username, name, status, face, '' as rname")
            ->name('user')
            ->where(['id' => ['not in', $arr]])
            ->order('id desc')
            ->select();
//        dump($res);die;
        // 将rname 存放到 $list数组 中
        foreach ($res as $k => $v) {
            $list[] = $v;
        }
//        dump($list);die;
        return view('', [
            'title' => '用户列表',
            'list' => $list
        ]);
    }

    // 用户添加 页面加载
    public function add()
    {
        return view('', ['title' => '用户添加']);
    }

    // 用户添加 处理
    public function doadd()
    {
        // 接收form提交过来的数据
        $res = input('post.');

        // 查询数据库中是否已存在该用户名 username
        $data = db('user')->where('username', $res['username'])->find();
//        dump($data);die;

        // 判断数据库中是否存在该用户名
        // 若 $data = null, 则执行添加；否则，添加失败

        if (!empty($data)) {
            $this->error('该用户名已存在');
        } else {
            // 正则验证：
            // 用户名：只能输入4-20个以字母开头、可带数字、“_”、“.”
            $pregUsername = '/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){3,19}$/';
            if (!preg_match($pregUsername, $res['username'])) {
                $this->error('用户名格式不正确o(╥﹏╥)o');
            }
            // 姓名：输入2-15个字符(仅支持中文)
            $pregName = '/^[\x{4e00}-\x{9fa5}]{2,15}+$/u';
            if (!preg_match($pregName, $res['name'])) {
                $this->error('姓名格式不正确o(╥﹏╥)o');
            }
            // 密码：请输入6-20个字符（必须是字母和数字组合，不区分大小写）
            $pregUserpass = '/^(?!([a-zA-Z]+|\d+)$)[a-zA-Z\d]{6,20}$/i';
            if (!preg_match($pregUserpass, $res['userpass'])) {
                $this->error('密码格式不正确o(╥﹏╥)o');
            }

            // 判断密码是否为空
            if (empty($res['userpass'] || $res['repass'])) {
                $this->error('密码不可为空');
            }
            // 判断两次输入的密码是否一致
            if ($res['userpass'] == $res['repass']) {
                $res['userpass'] = md5($res['userpass']);
                unset($res['repass']);
            } else {
                $this->error('密码不一致!!!');
            }

            // 上传图片
            // 获取表单上传文件 例如上传了001.jpg
            $file = request()->file('face');
//            dump($file);die;
//            校验器，判断图片格式是否正确
            if ($this->validate(['face' => $file], ['face' => 'require|image']) !== true) {
                $this->error('请选择图像文件');
            } else {
                // 移动到框架应用根目录/public/uploads/ 目录下
                $info = $file->validate(['size' => 200000, 'ext' => 'jpg,png,gif'])
                    ->move(ROOT_PATH . 'public' . DS . 'uploads');
                // var_dump($info);die;
                if ($info) {
                    // 成功上传后 获取上传信息
                    // 存入相对路径/upload/日期/文件名
                    $imgurl = DS . 'uploads' . DS . $info->getSaveName();
                    // 将图片的路径赋值给变量
                    $data['face'] = $imgurl;
//                    dump($imgurl); // string
                    // 模板变量赋值
                    $this->assign('face', $imgurl);
//                    dump($res); // array (username, name, userpass)
//                    dump($imgurl); // string
//                    dump($data); // array (face)
                    // 将两个数组合并到一起
                    $arr = $res + $data;
//                    dump($arr);die;
//                    dump($arr['face']);die;
//
                    // 添加单条数据
//                    $list = db('user')->insert($res);
                    $list = db('user')->insert($arr);
//                    $list = Db::name('user')->data($data)->insert();
//                    dump($data['face']);die; // string
//                    dump($list);die;
                    if ($list > 0) {
                        $this->success('用户添加成功(*^▽^*)', 'admin/Userlist/index');
                    } else {
                        $this->error('用户添加失败o(╥﹏╥)o，请重试');
                    }

                } else {
                    // 上传失败获取错误信息
                    echo $file->getError();
                    return $this->error('请重试');
                }
            }

        }


    }

    // 用户编辑 页面加载
    public function edit($id)
    {
        // 查询user表中的数据
        $data = db('user')->where('id', $id)->find();
//        dump($data);die;

        return view('', [
            'data' => $data,
            'id' => $id
        ]);
    }

    // 用户编辑 处理
    public function doedit($id)
    {
        // 接收表单传过来的数据
        $res = input('post.');
//        dump($res);
//
//      // 查询数据库中是否存在该用户名 username
        $data = db('user')->where('id', $id)->find();
//        dump($data);die;

        // 正则验证
        // 用户名：只能输入4-20个以字母开头、可带数字、“_”、“.”
        $pregUsername = '/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){3,19}$/';
        if (!preg_match($pregUsername, $res['username'])) {
            $this->error('用户名格式不正确o(╥﹏╥)o');
        }
        // 姓名：输入2-15个字符(仅支持中文)
        $pregName = '/^[\x{4e00}-\x{9fa5}]{2,15}+$/u';
        if (!preg_match($pregName, $res['name'])) {
//            dump($res['name']);
            $this->error('姓名格式不正确o(╥﹏╥)o');
        }

        // 判断原用户名与编辑的用户名是否相等
        // 不相等时，查询数据库中是否存在该用户名(若$name 返回null, 则证明可以执行更新；否则，提示用户名已存在，再次跳转到编辑页面）
        if (!($res['username'] == $data['username'])) {
            // 查询数据库是否存在该用户名 name
            $username = db('user')->where('username', $res['username'])->find();
            // 如果 $username为空，则可以执行下一步的更新；否则用户名已存在
            if (!empty($username)) {
                $this->success('用户名已存在，请重新输入');
            }
        }

        // 上传图片
        // 获取表单上传文件 例如上传了001.jpg
        $file = request()->file('face');
//        dump($file);die;

//        校验器，判断图片格式是否正确
        if ($this->validate(['face' => $file], ['face' => 'require|image']) !== true) {
            $this->error('请选择图像文件');
        } else {
            // 移动到框架应用根目录/public/uploads/ 目录下
            $info = $file->validate(['size' => 200000, 'ext' => 'jpg,png,gif'])
                ->move(ROOT_PATH . 'public' . DS . 'uploads');
            // var_dump($info);die;
            if ($info) {
                // 成功上传后 获取上传信息
                // 存入相对路径/upload/日期/文件名
                $imgurl = DS . 'uploads' . DS . $info->getSaveName();
                // 将图片的路径赋值给变量
                $data['face'] = $imgurl;
//                dump($imgurl); // string
                // 模板变量赋值
                $this->assign('face', $imgurl);
//                dump($res); // array (username, name, userpass)
//                dump($imgurl);// string
//                dump($data); die;// array (face)

//              // 更新数据表中的数据
                $list = db('user')->where('id', $id)->update([
                    'username' => $res['username'],
                    'name' => $res['name'],
                    'face' => $data['face']
                ]);
//                dump($list);die;


                // 判断是否更新成功
                if (!empty($list)) {
                    $this->success('用户更新成功(*^▽^*)', 'admin/Userlist/index');
                } else {
                    $this->error('您没有做任何编辑', 'admin/Userlist/index');
                }


            } else {
                // 上传失败获取错误信息
                echo $file->getError();
                return $this->error('请重试');
            }
        }



    }

    // 修改密码 页面加载
    public function editpwd($id)
    {
        // 查询user表中的数据
        $data = db('user')->where('id', $id)->find();
//        dump($data);die;

        return view('', [
            'data' => $data,
            'id' => $id
        ]);
    }

    // 修改密码 处理
    public function doeditpwd($id)
    {
        $res = input('post.');
//        dump($res);

        // 判断是否进行了修改密码操作
        if (
            (empty($res['oldpwd']) && (!empty($res['userpass'] == $res['repass']))) ||
            (empty($res['oldpwd']) && !empty($res['userpass']))
        ) {
            $this->error('请输入原密码');

        } else if ((!empty($res['oldpwd']) && empty($res['userpass'])) ) {
            $this->error('您未进行任何操作');

        } else {
            // 查询数据库中是否存在该用户
            $data = db('user')->where('id', $id)->find();
//            dump($data);die;

            // 密码：请输入6-20个字符（必须是字母和数字组合，不区分大小写）
            $pregUserpass = '/^(?!([a-zA-Z]+|\d+)$)[a-zA-Z\d]{6,20}$/i';
            if (!preg_match($pregUserpass, $res['userpass'])) {
                $this->error('密码格式不正确o(╥﹏╥)o');
            }

            // 判断是否进行修改操作
            if (md5($res['oldpwd']) == $data['userpass']) {
                // 判断两次密码是否一致
                if ($res['userpass'] == $res['repass']) {
                    unset($res['repass']);
                    $res['userpass'] = md5($res['userpass']);
                    $this->success('密码修改成功(*^▽^*)', 'admin/Userlist/index');
                } else {
                    $this->error('两次密码不一致');
                }

            } else {
                $this->error('原密码错误');
            }

        }


    }


    // 用户删除
//    public function delete($id)
//    {
//        // 查询 user.id 查询到 user_role 表 中的 uid,
//        $select = db('user_role')->where('uid', $id)->find();
//        // 删除 user_role 中的 uid， 即删除 用户 与 角色 之间的关联关系
//        $del = db('user_role')->where('uid', $id)->delete();
//        // 删除user表中的id
//        $data = db('user')->where('id', $id)->delete();
//        if ($data) {
//            $this->success('用户删除成功(*^▽^*)', 'admin/Userlist/index');
//        } else {
//            $this->error('用户删除失败o(╥﹏╥)o');
//        }
//
//    }

    public function delete($id)
    {
        // 查询 user.id 查询到 user_role 表 中的 uid,
        $select = db('user_role')->where('uid', $id)->find();
        // 删除 user_role 中的 uid， 即删除 用户 与 角色 之间的关联关系
        $del = db('user_role')->where('uid', $id)->delete();
        // 删除user表中的id
//        dump($id);die;
        $data = db('user')->where('id', $id)->delete();
//        dump($data);die;
        if ($data) {
            $arr['status'] = 1;
            $arr['msg'] = '删除成功';
            return $arr;
        } else {
            $arr['status'] = 2;
            $arr['msg'] = '删除失败';
            return $arr;
        }
    }

    // 分配角色 页面加载
    public function saverole($id)
    {
        // 查询所有用户
        $data = db('role')->select();

        // 查询指定用户的角色
        $userrole = [];
        $arr = db('user_role')
            ->field('rid')
            ->where('uid', $id)
            ->select();
        foreach ($arr as $key => $v) {
            $userrole[] = $v['rid'];
        }

        return view('', [
            'title' => '分配权限',
            'data' => $data,
            'id' => $id,
            'userrole' => $userrole
        ]);
    }

    // 分配角色 处理
    public function dosaverole()
    {
        // 接收post传过来的所有数据
        $res = input('post.');

        // 清空用户的角色
        $del = db('user_role')->where('uid', $res['uid'])->delete();

        // 如果用户的角色为空，则不执行任何操作
        if (!empty($res['role'])) {
            // 角色 数组
            $userrole = $res['role'];

            foreach ($userrole as $v) {
                $arr['uid'] = $res['uid'];
                $arr['rid'] = $v;
                $data = db('user_role')->insert($arr);
            }

            $this->success('分配角色成功(*^▽^*)', 'admin/Userlist/index');
        }
    }

    // 验证用户名唯一性 (添加时)
    public function addcheckusername()
    {
        $res = input('post.');

        // 查询数据库中是否已存在该用户名 username
        $data = db('user')->where('username', $res['username'])->find();

        // 判断数据库是否返回数据
        if (empty($data)) {
            return true;
        } else {
            return false;
        }
    }

    // 验证用户名唯一性 (编辑时)
    public function editcheckusername()
    {
        // 接收form提交过来的 id 和 username
        $id = input('id');
        $username = input('username');

        // 查询数据库中是否已存在该用户名 username
        $data = db('user')->where('id', $id)->find();

        // 判断是否更改用户名
        // 若 username 与 form提交过来的 一致 ，则未更改，返回1，提示 【您未进行更改】
        // 若 进行了更改  查询数据库中是否存在该 username, 若存在，返回2， 提示 【用户名已存在】; 若不存在，返回3，不做任何提示
        if ($data['username'] == $username) {
            return 1;
        } else {
            $res = db('user')->where('username', $username)->find();
            if ($res > 0) {
                return 2;
            } else {
                return 3;
            }
        }

    }

    // 验证密码
    public function edituserpass()
    {
        $id = input('id');

        // 查询数据库中是否存在该用户
        $data = db('user')->where('id', $id)->find();

        if (!empty($data)) {
            return $data['userpass'];
        } else {
            return false;
        }
    }
}

